package com.huwei.modules.base.shiro;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

/**
 *	 处理同一类型地址多个角色可访问
 *	注意：：： 该类不能注入到spring容器中，即不能使用@Bean 、@Component，只能在ShiroFilterFactoryBean 配置时，直接new；原因：如果该filter出现在spring容器中，
 *spring将该filter视为一个正常的filter，并将请求交个该类执行，而这个请求的执行时机可能优先于shiro的filter链，则代码：Subject subject = getSubject(request, response); 
 *将抛出异常，且该类的执行时机本应在shiro的filter链中执行；
 * @author huwei
 */
public class RoleOrAuthorizationFilter extends AuthorizationFilter{

    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
            throws Exception {
         Subject subject = getSubject(request, response);  
            String[] rolesArray = (String[]) mappedValue;  
            //没有角色限制，有权限访问  
            if (rolesArray == null || rolesArray.length == 0) { 
                return true;  
            }  
            for (int i = 0; i < rolesArray.length; i++) {  
                 //若当前用户是rolesArray中的任何一个，则有权限访问  
                if (subject.hasRole(rolesArray[i])) {
                    return true;  
                }  
            }    
            return false;  
    }
}